package cn.trda.base.refject;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;
/* 
 * 反射不是给程序员用的，是给框架用的
 * 		Person.java			Person.class    Person对象
 * 		class Person(){							Pserson.class字节码 对象
 * 			成员变量 0										Filed对象
 * 			成员方法0										Method对象
 * 			构造方法										Constructor对象
 *		}
 */



import cn.trda.pojo.Person;

@SuppressWarnings("all")
public class TestRefject {
		@Test   // 对象。方法  
		public void test1() throws Exception{
			
			Class.forName("com.mysql.jdbc.Driver");//类名
			// 通过反射获取字节码对象
		
			Class c=	Class.forName("cn.trda.pojo.Person");
			
			// 通过字节码对象获取 构造器  
			Constructor con=c.getConstructor();
			//	通过构造器创建person对象
			//Person obj=(Person) con.newInstance();
			Person obj=	(Person) c.newInstance();
			//  通过字节码对象获取字段getField 只能公有
			Field	f=c.getField("age");
			// 给字段赋值
			f.set(obj, 15);
			System.out.println(obj.getAge());
			//  通过字节码对象获取私有字段
			Field	f1=c.getDeclaredField("username");
			//设置访问权限
			f1.setAccessible(true);
			// 给字段赋值
			f1.set(obj, "admin");
			// 通过字节码对象获取 方法
			Method m=c.getMethod("eat");
			//执行获取到的方法
			m.invoke(obj);
			// 通过字节码对象获取 方法
			Method m2=c.getDeclaredMethod("eat",String.class,int.class);
			//设置访问权限
			m2.setAccessible(true);
			//执行获取到的方法
			System.out.println(m2.invoke(obj,"张三",25));
						
			
			//System.out.println(obj.eat("adas"));
		}

}
